package com.xue.websocket;

/**
 * Date:2020年11月20日 下午3:44:34
 * Copyright (c) 2020, www.bwbroad.com All Rights Reserved
 */

import java.io.IOException;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;

/**
 * Description: websocket通讯 <br/>
 * Date:2020年11月20日 下午3:44:34 <br/>
 * 需要配置MyWebSocketConfigurer <br/>
 * https://www.cnblogs.com/cnsyear/p/12635382.html<br/>
 * https://www.cnblogs.com/cnsyear/p/12638121.html<br/>
 * 由于websocket是长连接，session保持在一个server中，<br/>
 * 所以在不同server在使用websocket推送消息时就需要获取对应的session进行推送，<br/>
 * 在分布式系统中就无法获取到所有session，这里就需要使用一个中间件将消息推送到各个系统中，
 * 在这里使用的redis，使用redis的sub/pub功能<br/>
 * WebSocket是线程安全的，有用户连接时就会创建一个新的端点实例，一个端点只能保证一个线程调用。总结就是，WebSocket是多对象的
 * 
 * @author xuejianxin
 */

@ServerEndpoint("/echo")
@Component
public class MyWebSocketServer {
	private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MyWebSocketServer.class);

	@OnOpen
	public void onOpen(Session session) {
		log.info("----->onOpen");
	}

	// 关闭连接时调用
	@OnClose
	public void onClose() {
		log.info("----->onClose");
	}

	// 收到客户端消息
	@OnMessage
	public void onMessage(Session session, String message) throws IOException {
		log.info("msg->"+message);
	}
	
	@OnError
	public void onError(Session session, Throwable error) {
		log.error("----->onError");
		error.printStackTrace();
	}


}